package com.qfmy.common.utils;

import org.mindrot.jbcrypt.BCrypt;
import org.springframework.util.StringUtils;

/**
 * 密码加密工具类（基于BCrypt算法）
 * BCrypt特点：
 * 1. 自动生成随机盐值（无需额外存储盐）
 * 2. 加密后结果包含盐信息（验证时无需单独传入盐）
 * 3. 计算强度可调整（默认10轮，值越大加密越慢，安全性越高）
 */
public class PasswordEncryptUtil {

    // 加密强度（4-31之间，值越大计算越耗时，默认10）
    private static final int WORK_FACTOR = 12;

    /**
     * 私有构造方法，禁止实例化
     */
    private PasswordEncryptUtil() {
    }

    /**
     * 对原始密码进行加密
     * @param rawPassword 原始密码（用户输入的明文）
     * @return 加密后的密码（包含盐值，可直接存入数据库）
     */
    public static String encrypt(String rawPassword) {
        // 校验原始密码非空
        if (!StringUtils.hasText(rawPassword)) {
            throw new IllegalArgumentException("原始密码不能为空");
        }
        // BCrypt.hashpw会自动生成盐值并加密，返回格式：$2a$12$xxxxxx...（包含算法、强度、盐、哈希结果）
        return BCrypt.hashpw(rawPassword, BCrypt.gensalt(WORK_FACTOR));
    }

    /**
     * 验证原始密码与加密密码是否匹配
     * @param rawPassword 原始密码（用户输入的明文）
     * @param encodedPassword 加密后的密码（从数据库查询的密文）
     * @return 是否匹配（true=匹配，false=不匹配）
     */
    public static boolean verify(String rawPassword, String encodedPassword) {
        // 校验参数非空
        if (!StringUtils.hasText(rawPassword) || !StringUtils.hasText(encodedPassword)) {
            return false;
        }
        // BCrypt.checkpw会自动从加密密码中提取盐值进行验证
        return BCrypt.checkpw(rawPassword, encodedPassword);
    }
}